package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"strings"

	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
)

// DebugServer 调试版本的 MCP 服务器
type DebugServer struct {
	mysqlServer *MySQLMCPServer
}

// NewDebugServer 创建调试服务器
func NewDebugServer(config DatabaseConfig) (*DebugServer, error) {
	mysqlServer, err := NewMySQLMCPServer(config)
	if err != nil {
		return nil, err
	}

	return &DebugServer{
		mysqlServer: mysqlServer,
	}, nil
}

// debugToolHandler 包装工具处理器，添加调试信息
func (d *DebugServer) debugToolHandler(name string, handler func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error)) func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
		log.Printf("调试: 收到工具调用 '%s'", name)
		log.Printf("调试: 请求参数: %+v", request.GetArguments())

		// 调用原始处理器
		result, err := handler(ctx, request)

		if err != nil {
			log.Printf("调试: 工具 '%s' 执行出错: %v", name, err)
		} else {
			log.Printf("调试: 工具 '%s' 执行成功", name)
		}

		return result, err
	}
}

// registerDebugTools 注册带调试功能的工具
func (d *DebugServer) registerDebugTools(s *server.MCPServer) {
	log.Println("调试: 开始注册工具...")

	// 简单的 ping 工具用于测试连接
	s.AddTool(
		mcp.NewTool("ping",
			mcp.WithDescription("测试服务器连接是否正常"),
		),
		d.debugToolHandler("ping", d.handlePing),
	)

	// 注册原有的工具（带调试）
	s.AddTool(
		mcp.NewTool("execute_query",
			mcp.WithDescription("执行任意 SQL 查询（SELECT、INSERT、UPDATE、DELETE 等）"),
			mcp.WithString("query",
				mcp.Required(),
				mcp.Description("要执行的 SQL 查询语句"),
			),
		),
		d.debugToolHandler("execute_query", d.mysqlServer.handleExecuteQuery),
	)

	s.AddTool(
		mcp.NewTool("list_tables",
			mcp.WithDescription("列出当前数据库中的所有表"),
			mcp.WithString("pattern",
				mcp.Description("表名匹配模式（可选，支持 LIKE 语法）"),
			),
		),
		d.debugToolHandler("list_tables", d.mysqlServer.handleListTables),
	)

	log.Println("调试: 工具注册完成")
}

// handlePing 处理 ping 请求
func (d *DebugServer) handlePing(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	log.Println("调试: 执行 ping 测试")

	// 测试数据库连接
	if err := d.mysqlServer.db.Ping(); err != nil {
		return mcp.NewToolResultError(fmt.Sprintf("数据库连接失败: %v", err)), nil
	}

	return mcp.NewToolResultText("Pong! 服务器和数据库连接正常"), nil
}

// Close 关闭调试服务器
func (d *DebugServer) Close() error {
	if d.mysqlServer != nil {
		return d.mysqlServer.Close()
	}
	return nil
}

// runDebugServer 运行调试服务器
func runDebugServer() {
	log.Println("启动调试模式的 MySQL MCP 服务器...")

	// 从环境变量获取数据库配置
	config := DatabaseConfig{
		Host:     getEnvOrDefault("MYSQL_HOST", "localhost"),
		Port:     getEnvOrDefault("MYSQL_PORT", "3306"),
		User:     getEnvOrDefault("MYSQL_USER", "root"),
		Password: getEnvOrDefault("MYSQL_PASSWORD", "12345678"),
		Database: getEnvOrDefault("MYSQL_DATABASE", "test"),
	}

	log.Printf("调试: 数据库配置 - Host: %s, Port: %s, User: %s, Database: %s",
		config.Host, config.Port, config.User, config.Database)

	// 验证必需的配置参数
	if config.User == "" {
		log.Fatal("错误：MYSQL_USER 环境变量是必需的")
	}
	if config.Database == "" {
		log.Fatal("错误：MYSQL_DATABASE 环境变量是必需的")
	}

	// 创建调试服务器
	debugServer, err := NewDebugServer(config)
	if err != nil {
		log.Fatalf("创建调试服务器失败: %v", err)
	}
	defer debugServer.Close()

	// 创建 MCP 服务器
	s := server.NewMCPServer(
		"MySQL MCP Debug Server",
		"1.0.0-debug",
		server.WithToolCapabilities(true),
		server.WithRecovery(),
	)

	// 注册调试工具
	debugServer.registerDebugTools(s)

	log.Println("调试: MCP 服务器已准备就绪，等待连接...")

	// 添加错误恢复机制
	defer func() {
		if r := recover(); r != nil {
			log.Printf("调试: 服务器出现致命错误: %v", r)
		}
	}()

	if err := server.ServeStdio(s); err != nil {
		log.Fatalf("调试: 服务器错误: %v", err)
	}
}

// 检查是否需要运行调试模式
func init() {
	if len(os.Args) > 1 && strings.Contains(strings.Join(os.Args[1:], " "), "debug") {
		log.Println("检测到调试模式参数，将运行调试服务器")
	}
}
